package com.xyoto.community.mapper.main;

import com.xyoto.community.dto.UserSaveTitleDTO;
import com.xyoto.community.po.*;


import com.xyoto.community.cache.UserCache;
import com.xyoto.community.entity.main.User;
import com.xyoto.community.entity.wechat.WxUserMessage;
import com.xyoto.community.po.UserPO;
import com.xyoto.community.vo.UserDetailsVo;
import io.swagger.annotations.ApiModel;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * @author coderFu
 * @create 2021/10/2
 */
@ApiModel("用户持久层接口")
public interface UserMapper {
    /**
     * 根据用户id查询用户头像、昵称
     *
     * @param userId 用户id
     * @return UserPO
     */
    UserPO getUserPartInfoById(Integer userId);

    /**
     * 根据用户id list 查询用户头像、昵称组
     *
     * @param userIds 用户id list
     * @return 用户头像、昵称组
     */
    List<UserPO> getUserListPartInfoById(@Param("collection") Set<Integer> userIds);


    /**
     * 根据用户openid查询用户信息
     *
     * @param openid 用户唯一标识
     * @return 返回用户基本信息
     */
    UserCache getUserMessageByOpenid(String openid);

    /**
     * 根据用户openid判断用户是否存在
     *
     * @param openid 用户唯一标识
     * @return 1 存在   0不存在
     */
    Integer judgeUserExistStatus(String openid);

    /**
     * 保存用户信息到数据库
     *
     * @param user 用户信息
     * @return 1 成功插入  0失败
     */
    Integer saveUser(User user);


    /**
     * 更新用户微信获取到信息
     *
     * @param wxUserMessage
     * @return
     */
    Integer updateUserWxMessage(WxUserMessage wxUserMessage);

    /**
     * 根据用户id查询用户详情
     *
     * @param userId
     * @return
     */
    User selectOneByUserId(Integer userId);

    /**
     * 根据用户id获取用户禁止状态
     *
     * @param userId
     * @return
     */
    Integer getUserDeleteStatusById(Integer userId);

    /**
     * 根据用户id集合获取用户简单信息
     *
     * @param userIds
     * @return
     */
    List<UserPO> getUserSimpleList(List<Integer> userIds);

    /**
     * 获取我的关注用户信息列表
     *
     * @param userId 当前登录用户的id
     * @return 我的关注用户信息列表
     */
    List<MyFollowUserInfoPO> getMyFollowList(Integer userId, Integer endIndexId);

    /**
     * 根据实体对象更新数据表部分信息，包括头像，昵称，性别，个性签名，生日
     *
     * @param user
     * @return
     */
    Integer updateBaseInfoByUser(User user);

    /**
     * 获取用户详情信息
     *
     * @param userId 需要查询的用户id
     * @return 用户详情信息
     */
    UserDetailsVo getUserDetailsById(Integer userId);

    /**
     * 获取我的个人资料
     *
     * @param userId 用户id
     * @return
     */
    UserInfoPO getUserInfo(Integer userId);

    /**
     * 根据用户活跃度倒序排序后，获取该用户的排名，活跃度相同的用户排名一致，并且排名不会断层
     *
     * @param userId
     * @return
     */
    Integer countRankByUserIdOrderByHotDesc(Integer userId);

    /**
     * 根据用户id获取用户的粉丝列表
     *
     * @param userId
     * @param endIndexId
     * @return
     */
    List<MyFollowUserInfoPO> getMyFansList(Integer userId, Integer endIndexId);

    List<UserFollowStatusPO> checkIsEachAttention(Integer userId, List<Integer> fansIds);

    /**
     * 获取用户活跃度
     *
     * @param userId
     * @return
     */
    Integer getHot(Integer userId);

    /**
     * 根据用户id判断用户是否存在
     *
     * @param userId
     * @return
     */
    UserPO checkUserIsExist(Integer userId);

    /**
     * 获取用户信息
     *
     * @param userId
     * @return
     */
    UserCache getUserCache(Integer userId);

    /**
     * 根据时间倒序获取用户id
     *
     * @param endIndexId
     * @return {@link List< UserPO>}
     * @author 廖振辉
     */
    List<UserPO> selectListOrderByCreateTimeDEsc(@Param("endIndexId") Integer endIndexId);

    /**
     * 根据昵称模糊查询用户
     *
     * @param nickname
     * @return {@link List< UserPO>}
     * @author 廖振辉
     */
    List<UserPO> selectListLikeNickname(@Param("nickname") String nickname);

    /**
     * 用户新增头衔
     * @param userSaveTitleDTO
     * @return
     */
    Integer updateUserTitle(UserSaveTitleDTO userSaveTitleDTO);

    /**
     * 获取用户总数
     * @author 廖振辉
     * @return {@link Integer}
     */
    Integer countTotal();

    /**
     * 统计昵称的个数
     * @author 廖振辉
     * @param nickname
     * @return {@link Integer}
     */
    Integer countNickname(String nickname);
}
